package main

import (
	"fmt"
	"math/rand"
	"sort"
	"strings"
)

func main() {
	//test1()
	test2()
	// test3()
	// test4()
	// test5()
	// test6()
	// test7()
	//test8()
	// test9()
}

// 创建
func test1() {
	// 创建map
	MAP := make(map[string]int, 8)

	fmt.Println(MAP)

	// 创建的时候初始化

	map2 := map[string]int{
		"张三": 9,
		"李四": 9,
		"王五": 9,
	}
	fmt.Println(map2)
}

// 判断某个键是否存在
func test2() {
	map_new := map[string]int{
		"1": 1,
		"2": 2,
		"3": 3,
	}
	// 如果key存在ok为true,v为对应的值；不存在ok为false,v为值类型的零值

	if v, ok := map_new["1"]; ok {
		fmt.Println("存在", v)
		delete(map_new, "4")
	} else {
		fmt.Println("不存在")
	}
}

// map的遍历
func test3() {
	map_new := map[string]int{
		"张胜豪": 1,
		"长孙":  2,
		"二":   3,
	}
	for k, v := range map_new {
		fmt.Println(k, ",", v)
	}
}

// 使用delete()函数删除键值对
func test4() {
	map_new := map[string]int{
		"张胜豪": 1,
		"长孙":  2,
		"二":   3,
	}
	delete(map_new, "二") // 删除key为 “二”
	for k, v := range map_new {
		fmt.Println(k, ",", v)
	}
}

// 按照指定顺序遍历map
func test5() {

	var hashmap = make(map[string]int, 200)

	for i := 0; i < 200; i++ {
		key := fmt.Sprintf("stu%03d", i)

		value := rand.Intn(100)

		hashmap[key] = value
	}

	var keys = make([]string, 0, 200)

	// 取出map中的所有keys
	for key := range hashmap {
		keys = append(keys, key)
	}

	// 对keys进行排序
	sort.Strings(keys)

	// 按照排序后的keys排序map

	for _, key := range keys {
		fmt.Println(key, hashmap[key])
	}
}

// 元素为map类型的切片 json格式为 [{},{},{}]
// 类似java中 list<map<String,String>>
func test6() {
	var mapSlice = make([]map[string]string, 3)
	for index, value := range mapSlice {
		fmt.Printf("index:%d value %v\n", index, value)
	}

	fmt.Println("after init")
	// 对切片中的map元素进行初始化
	mapSlice[0] = make(map[string]string, 10)
	mapSlice[0]["name"] = "小王子"
	mapSlice[0]["password"] = "123456"
	mapSlice[0]["address"] = "沙河"
	for index, value := range mapSlice {
		fmt.Printf("index:%d value:%v\n", index, value)
	}
}

// 值为切片类型的map
func test7() {
	var hashmap = make(map[string][]string, 3)
	fmt.Println(hashmap)

	key := "中国"

	hashmap[key] = []string{"香港", "河南"}
	hashmap[key] = []string{"香港", "河南1"}
	fmt.Println(hashmap)

}

// 写一个程序，统计一个字符串中每个单词出现的次数。
// 比如：”how do you do”中how=1 do=2 you=1。
func test8() {
	str := "how do you do,wang to you do how"

	// 初始化一个map
	strMap := make(map[string]int)

	// 把字符串分每个单词为key放到map中，放的时候计数器+1
	strArr := strings.Split(str, " ")
	fmt.Println(strArr)

	for i, v := range strArr {
		if strings.Contains(v, ",") {
			// 删除原来的元素
			strArr = append(strArr[:i], strArr[i+1:]...)

			strArr = append(strArr, strings.Split(v, ",")...)
		}
	}

	fmt.Println(strArr)

	//遍历这个切片
	for _, strV := range strArr {
		v, ok := strMap[strV]
		if !ok {
			strMap[strV] = 1
		} else {
			strMap[strV] = v + 1
		}
	}
	fmt.Println(strMap)
}

// 思考下面结果
func test9() {
	type Map map[string][]int
	m := make(Map)
	s := []int{1, 2}
	s = append(s, 3)
	fmt.Printf("%+v\n", s)
	m["q1mi"] = s
	fmt.Printf("%+v\n", m["q1mi"])

	s = append(s[:1], s[2])
	fmt.Printf("%+v\n", s)
	fmt.Printf("%+v\n", m["q1mi"])
}
